import pandas as pd
import numpy as np

# ndarray创建Series对象
data = np.array(['a', 'b', 'c', 'd'])
s = pd.Series(data)
print(s)
# 0    a
# 1    b
# 2    c
# 3    d
# dtype: object
# 没有传递任何索引，所以索引默认从 0 开始分配 ，其索引范围为 0 到len(data)-1 这种设置方式被称为“隐式索引”。
# 显式索引
s2 = pd.Series(data, index=[100, 101, 102, 103])
print(s2)

# dict创建Series对象
# 以把 dict 作为输入数据。如果没有传入索引时会按照字典的键来构造索引；
# 反之，当传递了索引时需要将索引标签与字典中的值一一对应。
data = {'a': 0., 'b': 1., 'c': 2.}
s3 = pd.Series(data)
s4 = pd.Series(data, index=['b', 'c', 'd', 'a'])  # index参数传递索引时
# 标量创建Series对象
s5 = pd.Series(5, index=[0, 1, 2, 3])  # 如果 data 是标量值，则必须提供索引，示例如下：

# 访问Series数据
s6 = pd.Series([1, 2, 3, 4, 5], index=['a', 'b', 'c', 'd', 'e'])
print(s6[0])  # 位置下标 1
print(s6['a'])  # 标签下标  1
print(s6[:3])  # 前面三个元素
print(s6[-3:])  # 最后三个元素
print(s6[['a', 'c', 'd']])  # 访问多个元素

# Series常用属性
# axes	以列表的形式返回所有行索引标签。
# dtype	返回对象的数据类型。
# empty	返回一个空的 Series 对象。
# ndim	返回输入数据的维数。
# size	返回输入数据的元素数量。
# values	以 ndarray 的形式返回 Series 对象。
# index	返回一个RangeIndex对象，用来描述索引的取值范围。
s9 = pd.Series(np.random.randn(5))
# 0   -1.369375
# 1    0.656750
# 2   -0.230466
# 3   -1.649780
# 4    0.646791
# dtype: float64
print(s9.axes)  # [RangeIndex(start=0, stop=5, step=1)]
print(s9.dtype)  # float64
print(s9.empty)  # False
print(s9.ndim)  # 1
print(s9.size)  # 5
print(s9.values)  # [-1.36937473  0.65675028 -0.23046601 -1.64978035  0.64679125]
print(s9.index)  # RangeIndex(start=0, stop=5, step=1)

# Series常用方法
# head()&tail()查看数据
print(s9.head(3))  # 返回前三行数据
print(s.tail(2))  # 输出后两行数据
#  isnull()&nonull()检测缺失值
# None代表缺失数据
s7 = pd.Series([1, 2, 5, None])
print(pd.isnull(s7))  # 是空值返回True
print(pd.notnull(s7))  # 空值返回False
# 0     True
# 1     True
# 2     True
# 3    False
# dtype: bool
